home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 37
/
Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso
/
Aminet
/
game
/
patch
/
jst32b_dev.lha
/
jst_dev
/
sources
/
src
/
DiskTools
/
psywfiles.asm
< prev
next >
Wrap
Assembly Source File
|
2000-03-31
|
3KB
|
195 lines
; *** Psygnosis disk utilities V1.1
; *** Written by Jean-François Fabre
include "libs.i"
XREF _SysBase
XDEF _WriteFiles
XDEF @WriteFiles
; *** create several files from the disk image
; *** very intricate routine, sorry
; in: A0/stack: diskfile buffer
; out D0: error flag (0=OK)
_WriteFiles:
move.l 4(A7),A0
@WriteFiles:
movem.l D1-A6,-(sp)
move.l A0,DiskBuffer
lea dosname,A1
moveq #0,D0
move.l _SysBase,A6
JSRLIB OpenLibrary
move.l D0,dosbase
beq WF_UN_Error
move.l DiskBuffer,A0
lea $10(A0),A1 ; for directory buffer, variable by $10
lea $C00(A0),A2 ; for directory block list, constant
moveq.l #1,D6 ; the file counter, starts at 1
; *** LOOP ON THE FILES
wloop$
cmp.b #$FF,(A1) ; no name -> no more files
beq WF_OK
; ** for each file, allocate a buffer to join the
; ** different file parts
move.l $C(A1),D0 ; file length
add.l #$400,D0 ; to be able not to overflow buffer
move.l D0,blocksize ; store the size
movem.l D1-A6,-(sp)
move.l blocksize,D0
move.l #MEMF_CLEAR,D1
move.l _SysBase,A6
JSRLIB AllocMem
movem.l (sp)+,D1-A6
move.l D0,blockbuffer
beq WF_AM_Error
move.l blockbuffer,A4 ; A4: current pointer on the file buffer
; ** search the block bitmap for relevant blocks
moveq.l #0,D3 ; block counter
sloop$
move.b (A2,D3.W),D4
cmp.w #$3FF,D3
bcs notend$
cmp.b #$FF,D4
beq writefile$ ; end of block info -> write file please
bra WF_DC_Error ; ripped disk corrupt, directory error
notend$
cmp.b D6,D4 ; block matches our file??
beq matchblock$
nextblock$
addq.l #1,D3 ; next offset
bra sloop$
; *** calculate the real offset and copy the block in the buffer
matchblock$
move.l D3,D4 ; copy position
lsl.l #8,D4 ; *256
lsl.l #2,D4 ; *4 -> *$400
sub.l #$3000,D4 ; we started from physical track 2
move.l DiskBuffer,A3
add.l D4,A3
; ** copies a block in the file buffer
move.w #$FF,D5
bcopy$
move.l (A3)+,(A4)+
dbf D5,bcopy$
bra nextblock$
writefile$
; *** open a new file
move.l A1,D1 ; pointer on the file name to create
move.l #MODE_NEWFILE,D2
move.l dosbase,A6
movem.l D1-A6,-(sp)
JSRLIB Open ; open a new file
movem.l (sp)+,D1-A6
tst.l D0
beq WF_CF_Error
; *** write the data to the file
move.l D0,FHandle
move.l D0,D1
move.l blockbuffer,D2
move.l $C(A1),D3 ; file length
move.l dosbase,A6
movem.l D1-A6,-(sp)
JSRLIB Write
movem.l (sp)+,D1-A6
; *** close the file
move.l FHandle,D1
move.l dosbase,A6
movem.l D1-A6,-(sp)
JSRLIB Close
movem.l (sp)+,D1-A6
clr.l FHandle
bsr FreeBlockBuffer
; *** increase the pointer
; *** and the file counter
nextfile$
lea $10(A1),A1
addq.l #1,D6
bra wloop$
WF_OK:
moveq.l #0,D0
WF_Exit:
move.l dosbase,D1
beq fuck$
move.l D1,A1
move.l _SysBase,A6
JSRLIB CloseLibrary
move.l #0,dosbase
fuck$
bsr FreeBlockBuffer
movem.l (sp)+,D1-A6
rts
WF_CF_Error:
moveq.l #-1,D0
bra WF_Exit
WF_UN_Error:
moveq.l #-2,D0
bra WF_Exit
WF_DC_Error:
moveq.l #-3,D0
bra WF_Exit
WF_AM_Error:
moveq.l #-5,D0
bra WF_Exit
FreeBlockBuffer:
STORE_REGS
move.l blockbuffer,D1
beq skip$
move.l D1,A1
move.l blocksize,D0
move.l _SysBase,A6
JSRLIB FreeMem
clr.l blockbuffer
skip$
RESTORE_REGS
rts
blocksize:
dc.l 0
blockbuffer:
dc.l 0
DiskBuffer:
dc.l 0
FHandle:
dc.l 0
dosbase:
dc.l 0
dosname:
dc.b "dos.library",0